package org.study;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

/**
 * @author 学习hbase命名空间操作
 */
public class NamespaceDemo {

    Connection connection = null;
    Admin admin = null;

    @Before
    public void connect() throws IOException {
        // 获取HBase的配置
        Configuration conf = HBaseConfiguration.create();
        // 连接hbase不是直接连接它的主节点，而是要连接zookeeper，通过zookeeper获取hbase的主节点
        // 配置zookeeper的连接地址
        conf.set("hbase.zookeeper.quorum", HbaseConfig.get("hbase.zookeeper.quorum"));
        conf.set("hbase.zookeeper.property.clientPort", HbaseConfig.get("hbase.zookeeper.property.clientPort"));
        // 发起连接
        connection = ConnectionFactory.createConnection(conf);
        // 获取管理权
        admin = connection.getAdmin();
    }

    @After
    public void close() throws IOException {
        if(null != admin){
            admin.close();
        }
        if(null != connection){
            connection.close();
        }
    }

    @Test
    public void test() throws IOException {
        // 曾经遇到执行这个卡主不动，也不报错。后面发现是因为windows客户端的hosts没有配置对
        boolean isExists = admin.tableExists(TableName.valueOf("person"));
        System.out.println(isExists);
    }

    /**
     * 创建命名空间，如果namespace已存在会报错
     */
    @Test
    public void createNamespace() throws IOException {
        NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create("helloworld").build();
        admin.createNamespace(namespaceDescriptor);
    }

    /**
     * 删除命名空间，如果命名空间不存在会报错
     */
    @Test
    public void dropNamespace() throws IOException {
        admin.deleteNamespace("helloworld");
    }

    /**
     * 查询所有命名空间
     */
    @Test
    public void list_namespace() throws IOException {
        // 创建namespace
        String[] namespaces = admin.listNamespaces();
        for (String namespace : namespaces) {
            System.out.println(namespace);
        }
    }

    /**
     * 查询指定命名空间下所有的表
     */
    @Test
    public void list_namespace_tables() throws IOException {
        // 创建namespace
        TableName[] tableNames = admin.listTableNamesByNamespace("default");
        for (TableName tableName : tableNames) {
            System.out.println(new String(tableName.getName()));
        }
    }

}
